home *** CD-ROM | disk | FTP | other *** search
- #if __SC__ || __RCC__
- #pragma once
- #endif
-
- #ifndef _IOSTREAM_H_
- #define _IOSTREAM_H_
-
- #ifndef __cplusplus
- #error Use C++ compiler for iostream.h
- #endif
-
- /*
- * iostream.h -- basic stream I/O declarations
- *
- * $Id: iostream.h,v 1.1.1.1 1997/01/02 19:16:41 smarx Exp $
- *
- ****************************************************************************
- *
- * Rogue Wave Software, Inc.
- * P.O. Box 2328
- * Corvallis, OR 97339
- * Voice: (503) 754-3010 FAX: (503) 757-6650
- *
- * Copyright (C) 1991, 1993, 1994.
- * This software is subject to copyright protection under the laws of
- * the United States and other countries.
- * ALL RIGHTS RESERVED
- *
- ***************************************************************************
- *
- * $Log: iostream.h,v $
- * Revision 1.1.1.1 1997/01/02 19:16:41 smarx
- * cafe12
- *
- // *
- // * 13 5/01/96 10:26a Smarx
- // * added long double support
- // *
- // * 12 2/26/96 8:04a Smarx
- *
- * Rev 1.10 24 May 1995 15:42:34 Andrew
- * Fixed problem where structs/classes were not in pragma pack(__DEFALIGN)
- *
- * Rev 1.9 08 May 1995 15:20:40 Andrew
- * Fixed debug info problem
- *
- * Rev 1.8 03 May 1995 9:40:08 Andrew
- * Fixed problem with -A compiles
- *
- * Rev 1.7 14 Jan 1995 17:12:28 Andy
- * FIxed iostream.h so that users can use it in a precompiled header
- *
- * Rev 1.6 04 Jan 1995 14:20:50 Andy
- * added operator= (ostream_withassign&) member to class ostream_withassign
- *
- * Rev 1.5 02 Nov 1994 12:09:54 BUSHNELL
- * Ifdefed in long long support for intsize==4
- *
- * Rev 1.4 08 Oct 1994 14:11:54 BUSHNELL
- * Added pragma once for faster compilations
- *
- * Rev 1.3 05 Oct 1994 13:34:30 anderson
- * Added support for ios::binary and ios::translated
- *
- * Rev 1.2 04 Oct 1994 17:43:50 DYNIN
- * 10181 : added 2 funcs for MS compatibility.
- *
- * Rev 1.1 02 Jun 1994 21:35:42 bushnell
- * added ifdef so that MS RC will not include header twice
- *
- * Rev 1.0 28 Apr 1994 19:17:38 thompson
- * Initial revision.
- * Revision 1.4 1994/04/14 16:48:51 vriezen
- * Add conditional compilation for long long and long double
- *
- * Revision 1.3 1994/04/14 00:50:17 vriezen
- * Updated copywrite, added ID and LOG and changed comments to indicate .cpp filename
- *
- *
- *
- */
-
-
-
- #include <string.h> // to get memcpy and NULL
-
- // Definition of EOF must match the one in <stdio.h>
- #define EOF (-1)
-
- // extract a char from int i, ensuring that zapeof(EOF) != EOF
- #define zapeof(i) ((unsigned char)(i))
-
- typedef long streampos; // should be int or long
- typedef long streamoff; // should be int or long
-
- class streambuf;
- class ostream;
-
- #pragma pack(__DEFALIGN)
- class ios {
- public:
- // stream status bits
- enum io_state {
- goodbit = 0x00, // no bit set: all is ok
- eofbit = 0x01, // at end of file
- failbit = 0x02, // last I/O operation failed
- badbit = 0x04, // invalid operation attempted
- hardfail = 0x80 // unrecoverable error
- };
-
- // stream operation mode
- enum open_mode {
- in = 0x01, // open for reading
- out = 0x02, // open for writing
- ate = 0x04, // seek to eof upon original open
- app = 0x08, // append mode: all additions at eof
- trunc = 0x10, // truncate file if already exists
- nocreate = 0x20, // open fails if file doesn't exist
- noreplace = 0x40, // open fails if file already exists
- binary = 0x80, // file is not translated
- translated = 0x00 // for compatability
- };
-
- // stream seek direction
- enum seek_dir { beg=0, cur=1, end=2 };
-
- // formatting flags
- enum {
- skipws = 0x0001, // skip whitespace on input
- left = 0x0002, // left-adjust output
- right = 0x0004, // right-adjust output
- internal = 0x0008, // padding after sign or base indicator
- dec = 0x0010, // decimal conversion
- oct = 0x0020, // octal conversion
- hex = 0x0040, // hexidecimal conversion
- showbase = 0x0080, // use base indicator on output
- showpoint = 0x0100, // force decimal point (floating output)
- uppercase = 0x0200, // upper-case hex output
- showpos = 0x0400, // add '+' to positive integers
- scientific= 0x0800, // use 1.2345E2 floating notation
- fixed = 0x1000, // use 123.45 floating notation
- unitbuf = 0x2000, // flush all streams after insertion
- stdio = 0x4000 // flush stdout, stderr after insertion
- };
-
- // constants for second parameter of seft()
- static const long basefield; // dec | oct | hex
- static const long adjustfield; // left | right | internal
- static const long floatfield; // scientific | fixed
-
- // constructor, destructor
- ios(streambuf*);
- virtual ~ios();
-
- // for reading/setting/clearing format flags
- long flags();
- long flags(long);
- long setf(long _setbits, long _field);
- long setf(long);
- long unsetf(long);
-
- // reading/setting field width
- int width();
- int width(int);
-
- // reading/setting padding character
- char fill();
- char fill(char);
-
- // reading/setting digits of floating precision
- int precision(int);
- int precision();
-
- // reading/setting ostream tied to this stream
- ostream* tie(ostream*);
- ostream* tie();
-
- // find out about current stream state
- int rdstate(); // return the stream state
- int eof(); // non-zero on end of file
- int fail(); // non-zero if an operation failed
- int bad(); // non-zero if error occurred
- int good(); // non-zero if no state bits set
- void clear(int = 0); // set the stream state
- operator void* (); // zero if state failed
- int operator! (); // non-zero if state failed
-
- streambuf* rdbuf(); // get the assigned streambuf
-
- // for declaring additional flag bits and user words
- static long bitalloc(); // acquire a new flag bit, value returned
- static int xalloc(); // acquire a new user word, index returned
- long & iword(int); // return the nth user word as an int
- void* & pword(int); // return the nth user word as a pointer
-
- static void sync_with_stdio();
-
- // obsolete, for streams 1.2 compatibility
- int skip(int);
-
- protected:
- // additional state flags for ispecial and ospecial
- enum { skipping = 0x100, tied = 0x200 };
-
- streambuf* bp; // the associated streambuf
- ostream* x_tie; // the tied ostream, if any
- int state; // status bits
- int ispecial; // istream status bits ***
- int ospecial; // ostream status bits ***
- long x_flags; // formatting flag bits
- int x_precision; // floating-point precision on output
- int x_width; // field width on output
- int x_fill; // padding character on output
- int isfx_special; // unused ***
- int osfx_special; // unused ***
- int delbuf; // unused ***
- int assign_private; // unused ***
- /*
- * The data members marked with *** above are not documented in the AT&T
- * release of streams, so we cannot guarantee compatibility with any
- * other streams release in the use or values of these data members.
- * If you can document any expected behavior of these data members, we
- * will try to adjust our implementation accordingly.
- */
-
- ios(); // null constructor, does not initialize
-
- void init(streambuf*); // the actual initialization
-
- void setstate(int); // set all status bits
-
- static void (*stdioflush)();
-
- private:
- // for extra flag bits and user words
- static long nextbit;
- static int usercount;
- void *userwords;
- int nwords;
- void usersize(int);
-
- // these declarations prevent automatic copying of an ios
- ios(ios&); // declared but not defined
- void operator= (ios&); // declared but not defined
-
- };
- inline streambuf* ios::rdbuf() { return bp; }
- inline ostream* ios::tie() { return x_tie; }
- inline char ios::fill() { return x_fill; }
- inline int ios::precision() { return x_precision; }
- inline int ios::rdstate() { return state; }
- inline int ios::eof() { return state & eofbit; }
- inline int ios::fail() { return state & (failbit | badbit | hardfail); }
- inline int ios::bad() { return state & (badbit | hardfail); }
- inline int ios::good() { return state == 0; }
- inline long ios::flags() { return x_flags; }
- inline int ios::width() { return x_width; }
- inline int ios::width(int _w) { int _i = x_width; x_width = _w; return _i; }
- inline char ios::fill(char _c) { char _x = x_fill; x_fill = _c; return _x; }
- inline int ios::precision(int _p) {
- int _x = x_precision; x_precision = _p; return _x;
- }
- inline ios::operator void* () { return fail() ? 0 : this; }
- inline int ios::operator! () { return fail(); }
-
-
- class streambuf {
- public:
- // constructors and destructors
- streambuf(); // make empty streambuf
- streambuf(char*, int); // make streambuf with given char array
- virtual ~streambuf();
-
- // use the provided char array for the buffer if possible
- virtual streambuf* setbuf(char*, int);
-
- // getting (extracting) characters
- int sgetc(); // peek at next char
- int snextc(); // advance to and return next char
- int sbumpc(); // return current char and advance
- void stossc(); // advance to next character
- int sgetn(char*, int); // get next n chars
- virtual int xsgetn(char*, int); // implementation of sgetn
- virtual int underflow(); // fill empty buffer
- int sputbackc(char); // return char to input
- virtual int pbackfail(int); // implementation of sputbackc
- int in_avail(); // number of avail chars in buffer
-
- // putting (inserting) characters
- int sputc(int); // put one char
- int sputn(const char*, int); // put n chars from string
- virtual int xsputn(const char* s, int n); // implementation of sputn
- virtual int overflow(int = EOF); // flush buffer and make more room
- int out_waiting(); // number of unflushed chars
-
- // moving around in stream
- virtual streampos seekoff(streamoff, ios::seek_dir, int = (ios::in | ios::out));
- virtual streampos seekpos(streampos, int = (ios::in | ios::out));
- virtual int sync();
-
- void dbp(); // for debugging streambuf implementations
-
- protected:
- char* base(); // return start of buffer area
- char* ebuf(); // return end+1 of buffer area
- int blen(); // return length of buffer area
- char* pbase(); // return start of put area
- char* pptr(); // return next location in put area
- char* epptr(); // return end+1 of put area
- char* eback(); // return base of putback section of get area
- char* gptr(); // return next location in get area
- char* egptr(); // return end+1 of get area
- void setp(char*, char*); // initialize the put pointers
- void setg(char*, char*, char*); // initialize the get pointers
- void pbump(int); // advance the put pointer
- void gbump(int); // advance the get pointer
- void setb(char*, char*, int = 0 ); // set the buffer area
- void unbuffered(int);// set the buffering state
- int unbuffered(); // non-zero if not buffered
- int allocate(); // set up a buffer area
- virtual int doallocate(); // implementation of allocate
-
- private:
- short alloc_; // non-zero if buffer should be deleted
- short unbuf_; // non-zero if unbuffered
- char* base_; // start of buffer area
- char* ebuf_; // end+1 of buffer area
- char* pbase_; // start of put area
- char* pptr_; // next put location
- char* epptr_; // end+1 of put area
- char* eback_; // base of putback section of get area
- char* gptr_; // next get location
- char* egptr_; // end+1 of get area
-
- int do_snextc(); // implementation of snextc
-
- // these declarations prevent copying of a streambuf
- streambuf(streambuf&); // declared but not defined
- void operator= (streambuf&); // declared but not defined
- };
- inline char* streambuf::base() { return base_; }
- inline char* streambuf::pbase() { return pbase_; }
- inline char* streambuf::pptr() { return pptr_; }
- inline char* streambuf::epptr() { return epptr_; }
- inline char* streambuf::gptr() { return gptr_; }
- inline char* streambuf::egptr() { return egptr_; }
- inline char* streambuf::eback() { return eback_; }
- inline char* streambuf::ebuf() { return ebuf_; }
- inline int streambuf::unbuffered() { return unbuf_; }
- inline int streambuf::blen() { return ebuf_ - base_; }
- inline void streambuf::pbump(int _n) { pptr_ += _n; }
- inline void streambuf::gbump(int _n) { gptr_ += _n; }
- inline void streambuf::unbuffered(int _unb) { unbuf_ = (_unb != 0); }
- inline int streambuf::in_avail() {
- return (egptr_ > gptr_) ? egptr_ - gptr_ : 0;
- }
- inline int streambuf::out_waiting() { return pptr_ ? pptr_ - pbase_ : 0; }
- inline int streambuf::allocate() {
- return (base_ || unbuf_) ? 0 : doallocate();
- }
- inline int streambuf::sgetc() {
- return (gptr_ >= egptr_) ? underflow() :
- (unsigned char)(*gptr_);
- }
- inline int streambuf::snextc() {
- return (! gptr_ || (++gptr_ >= egptr_)) ?
- do_snextc() :
- (unsigned char)(*gptr_);
- }
- inline int streambuf::sbumpc() {
- return (gptr_ >= egptr_ && underflow() == EOF) ?
- EOF :
- (unsigned char)(*gptr_++);
- }
- inline void streambuf::stossc() {
- if( gptr_ >= egptr_ ) underflow();
- else ++gptr_;
- }
- inline int streambuf::sputbackc(char _c) {
- return (gptr_ > eback_) ?
- (unsigned char)(*--gptr_ = _c) :
- pbackfail(_c);
- }
- inline int streambuf::sputc(int _c) {
- return (pptr_ >= epptr_) ?
- overflow((unsigned char)_c) :
- (unsigned char)(*pptr_++ = _c);
- }
- inline int streambuf::sputn(const char* _s, int _n) {
- if( _n <= (epptr_ - pptr_) ) {
- memcpy(pptr_, _s, _n);
- pbump(_n);
- return _n;
- }
- return xsputn(_s, _n);
- }
- inline int streambuf::sgetn(char* _s, int _n) {
- if( _n <= (egptr_ - gptr_) ) {
- memcpy(_s, gptr_, _n);
- gbump(_n);
- return _n;
- }
- return xsgetn(_s, _n);
- }
-
-
- class istream : virtual public ios {
- public:
- // constructor and destructor
- istream(streambuf*);
- virtual ~istream();
-
- // Obsolete constructors, for streams 1.2 compatibility
- // obsolete: set skip via format, tie via tie() function
- istream(streambuf*, int _sk, ostream* _t=0);
- // obsolete: use strstream
- istream(int _sz, char*, int _sk=1);
- // obsolete: use fstream
- istream(int _fd, int _sk=1, ostream* _t=0);
-
- int ipfx(int = 0); // input prefix function
- int ipfx0(); // same as ipfx(0)
- int ipfx1(); // same as ipfx(1)
- void isfx() { } // unused input suffix function
-
- // set/read the get pointer's position
- istream& seekg(streampos);
- istream& seekg(streamoff, ios::seek_dir);
- streampos tellg();
-
- int sync();
-
- /*
- * Unformatted extraction operations
- */
- // extract characters into an array
- istream& get(char*, int, char = '\n');
- istream& read(char*, int);
-
- // extract characters into an array up to termination char
- istream& getline(char*, int, char = '\n');
- istream& getline(unsigned char *buf, int n, char d = '\n')
- { return getline((char*) buf, n, d); }
- istream& getline(signed char* buf, int n, char d = '\n')
- { return getline((char*) buf, n, d); }
-
- // extract characters into a streambuf up to termination char
- istream& get(streambuf&, char = '\n');
-
- // extract a single character
- istream& get(char&);
- istream& get(unsigned char&);
- int get();
-
- int peek(); // return next char without extraction
- int gcount(); // number of unformatted chars last extracted
- istream& putback(char); // push back char into input
-
- // extract and discard chars but stop at delim
- istream& ignore(int = 1, int = EOF);
-
- /*
- * Formatted extraction operations
- */
- istream& operator>> (istream& (*_f)(istream&));
- istream& operator>> (ios& (*_f)(ios&) );
- istream& operator>> (char*);
- istream& operator>> (unsigned char*);
- istream& operator>> (char&);
- istream& operator>> (unsigned char&);
- istream& operator>> (short&);
- istream& operator>> (int&);
- istream& operator>> (long&);
- #if (defined(RW_LONG_LONG) || __INTSIZE==4) && !__STDC__
- istream& operator>> (long long&);
- #endif
- istream& operator>> (unsigned short&);
- istream& operator>> (unsigned int&);
- istream& operator>> (unsigned long&);
- #if (defined(RW_LONG_LONG) || __INTSIZE==4) && !__STDC__
- istream& operator>> (unsigned long long&);
- #endif
- istream& operator>> (float&);
- istream& operator>> (double&);
- #if !__STDC__
- istream& operator>> (long double&);
- #endif
-
- // extract from this istream, insert into streambuf
- istream& operator>> (streambuf*);
-
- protected:
- istream();
- int do_ipfx(int); // implementation of ipfx
- void eatwhite(); // extract consecutive whitespace
-
- private:
- int gcount_; // chars extracted by last unformatted operation
- char do_get(); // implementation of get
- void floatstr(char*);
- char intstr(char*, int);
- };
- inline int istream::gcount() { return gcount_; }
- inline int istream::ipfx(int _need) {
- if( _need ? (ispecial & ~skipping) : ispecial )
- return do_ipfx(_need);
- return 1;
- }
- inline int istream::ipfx0() { return ispecial ? do_ipfx(0) : 1; }
- inline int istream::ipfx1() {
- return (ispecial & ~skipping) ? do_ipfx(1) : 1;
- }
- inline istream& istream::operator>> (unsigned char& _c) {
- if( ipfx0() )
- _c = bp->in_avail() ? bp->sbumpc() : do_get();
- return *this;
- }
- inline istream& istream::operator>> (char& _c) {
- if( ipfx0() )
- _c = bp->in_avail() ? bp->sbumpc() : do_get();
- return *this;
- }
- inline istream& istream::operator>> (unsigned char* _p) {
- return *this >> (char *)_p;
- }
- inline int istream::sync() { return bp->sync(); }
- inline istream& istream::operator>> (istream& (*_f) (istream&)) {
- return (*_f)(*this);
- }
- inline istream& istream::get(unsigned char& _c) {
- if( ipfx1() ) {
- if( bp->in_avail() ) _c = bp->sbumpc();
- else _c = do_get();
- gcount_ = 1;
- }
- return *this;
- }
- inline istream& istream::get(char& _c) {
- if( ipfx1() ) {
- if( bp->in_avail()) _c = bp->sbumpc();
- else _c = do_get();
- gcount_ = 1;
- }
- return *this;
- }
- inline int istream::get() {
- if( ipfx1() ) {
- int _c = bp->sbumpc();
- if( _c == EOF ) setstate(eofbit);
- else gcount_ = 1;
- return _c;
- }
- else return EOF;
- }
- inline int istream::peek() { return ipfx1() ? bp->sgetc() : EOF; }
-
-
- class ostream : virtual public ios {
- public:
- // constructors and destructor
- ostream(streambuf*);
- virtual ~ostream();
- // Obsolete constructors, for streams 1.2 compatibility
- ostream(int _fd); // obsolete, use fstream
- ostream(int _sz, char*); // obsolete, use strstream
-
- int opfx(); // output prefix function
- void osfx(); // output suffix function
- ostream& flush();
-
- // set/read the put pointer's position
- ostream& seekp(streampos);
- ostream& seekp(streamoff, ios::seek_dir);
- streampos tellp();
-
- /*
- * Unformatted insertion operations
- */
- ostream& put(char); // insert the character
- ostream& write(const char*, int); // insert the string
-
- /*
- * Formatted insertion operations
- */
- // insert the character
- ostream& operator<< (char);
- ostream& operator<< (unsigned char);
-
- // for the following, insert character representation of numeric value
- ostream& operator<< (short);
- ostream& operator<< (unsigned short);
- ostream& operator<< (int);
- ostream& operator<< (unsigned int);
- ostream& operator<< (long);
- ostream& operator<< (unsigned long);
- #if (defined(RW_LONG_LONG) || __INTSIZE==4) && !__STDC__
- ostream& operator<< (long long);
- ostream& operator<< (unsigned long long);
- #endif
- ostream& operator<< (float);
- ostream& operator<< (double);
- #if !__STDC__
- ostream& operator<< (long double);
- #endif
- // insert the null-terminated string
- ostream& operator<< (const char*);
-
- // insert character representation of the value of the pointer
- ostream& operator<< (void*);
-
- // extract from streambuf, insert into this ostream
- ostream& operator<< (streambuf*);
-
- // manipulators
- ostream& operator<< (ostream& (*_f)(ostream&));
- ostream& operator<< (ios& (*_f)(ios&));
-
- protected:
- int do_opfx(); // implementation of opfx
- void do_osfx(); // implementation of osfx
- ostream();
-
- private:
- void outstr(const char*, const char*);
- void printint(const char*);
- };
- inline int ostream::opfx() { return ospecial ? do_opfx() : 1; }
- inline void ostream::osfx() { if( x_flags & (stdio | unitbuf) ) do_osfx(); }
- inline ostream& ostream::operator<< (char _c) {
- if( opfx() )
- if( bp->sputc(_c) == EOF ) setstate(badbit);
- osfx();
- return *this;
- }
- inline ostream& ostream::operator<< (unsigned char _c) {
- return *this << (char)_c;
- }
- inline ostream& ostream::operator<< (const char* _s) {
- outstr(_s, 0);
- return *this;
- }
- inline ostream& ostream::operator<< (short _i) { return *this << (long) _i; }
- inline ostream& ostream::operator<< (unsigned short _i) {
- return *this << (unsigned long) _i;
- }
- inline ostream& ostream::operator<< (int _i) { return *this << (long) _i; }
- inline ostream& ostream::operator<< (unsigned int _i) {
- return *this << (unsigned long) _i;
- }
- inline ostream& ostream::operator<< (float _f) { return *this << (double) _f; }
- inline ostream& ostream::operator<< (ostream& (*_f)(ostream&)) {
- return (*_f)(*this);
- }
- inline ostream& ostream::put(char _c) {
- if( bp->sputc(_c) == EOF ) setstate(badbit);
- return *this;
- }
- inline ostream& ostream::write(const char* _s, int _n) {
- if( ! fail() )
- if( bp->sputn(_s, _n) != _n )
- setstate(badbit);
- return *this;
- }
-
-
- class iostream : public istream, public ostream {
- public:
- iostream(streambuf*);
- virtual ~iostream();
-
- protected:
- iostream();
- };
-
-
- class istream_withassign : public istream {
- public:
- // does no initialization
- istream_withassign();
-
- virtual ~istream_withassign();
-
- // gets buffer from istream and does entire initialization
- istream_withassign& operator= (istream&);
-
- // associates streambuf with stream and does entire initialization
- istream_withassign& operator= (streambuf*);
- };
-
-
- class ostream_withassign : public ostream {
- public:
- // does no initialization
- ostream_withassign();
-
- virtual ~ostream_withassign();
-
- // gets buffer from istream and does entire initialization
- ostream_withassign& operator= (ostream&);
- ostream_withassign& operator= (ostream_withassign&);
-
- // associates streambuf with stream and does entire initialization
- ostream_withassign& operator= (streambuf*);
- };
-
-
- class iostream_withassign : public iostream {
- public:
- // does no initialization
- iostream_withassign();
-
- virtual ~iostream_withassign();
-
- // gets buffer from stream and does entire initialization
- iostream_withassign& operator= (ios&);
-
- // associates streambuf with stream and does entire initialization
- iostream_withassign& operator= (streambuf*);
- };
-
-
- /*
- * The predefined streams
- */
- extern istream_withassign cin;
- extern ostream_withassign cout;
- extern ostream_withassign cerr;
- extern ostream_withassign clog;
-
- /*
- * Manipulators
- */
- ostream& endl(ostream&); // insert newline and flush
- ostream& ends(ostream&); // insert null to terminate string
- ostream& flush(ostream&); // flush the ostream
- ios& dec(ios&); // set conversion base to decimal
- ios& hex(ios&); // set conversion base to hexidecimal
- ios& oct(ios&); // set conversion base to octal
- istream& ws(istream&); // extract whitespace characters
-
- /*
- * The following allows proper initialization of cin, cout, cerr, clog
- */
- class Iostream_init {
- public:
- Iostream_init();
- ~Iostream_init();
-
- private:
- static int stdstatus;
- static int initcount;
- friend ios;
- };
-
- #pragma pack()
-
- #endif /* _IOSTREAM_H_ */
-